package com.example.config;

import com.example.constant.CommentConstant;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

import java.util.HashMap;

/**
 * @Description: 队列-交换机 关系配置类
 * @Author: mingtian
 * @CreateDate: 2021/1/21 15:30
 * @Version: 1.0
 */
@Component
public class RabbitMqConfig {

    /************************************************ 订单队列 *******************************************************/
    /**
     * 创建订单队列
     */
    @Bean
    public Queue orderQueue() {
        // 订单队列绑定死信交换机
        HashMap<String, Object> arguments = new HashMap<>(2);
        arguments.put("x-dead-letter-exchange", CommentConstant.DLX_EXCHANGE_NAME);
        arguments.put("x-dead-letter-routing-key", CommentConstant.DLX_ROUTING_KEY);
        return new Queue(CommentConstant.ORDER_QUEUE_NAME, true, false, false, arguments);
    }

    /**
     * 创建订单交换机
     *
     * @return
     */
    @Bean
    public DirectExchange orderExchange() {
        return new DirectExchange(CommentConstant.ORDER_EXCHANGE_NAME);
    }

    /**
     * 订单队列绑定订单交换机使用 路由键
     */
    @Bean
    public Binding orderBindingExchange(Queue orderQueue, DirectExchange orderExchange) {
        return BindingBuilder.bind(orderQueue).to(orderExchange).with(CommentConstant.ORDER_ROUTING_KEY);
    }

    /************************************************ 死信队列 *******************************************************/

    /**
     * 创建死信队列
     */
    @Bean
    public Queue dlxQueue() {
        return new Queue(CommentConstant.DLX_QUEUE);
    }

    /**
     * 创建死信交换机
     *
     * @return
     */
    @Bean
    public DirectExchange dlxExchange() {
        return new DirectExchange(CommentConstant.DLX_EXCHANGE_NAME);
    }

    /**
     * 死信队列绑定订单交换机使用
     */
    @Bean
    public Binding dlxBindingExchange(Queue dlxQueue, DirectExchange dlxExchange) {
        return BindingBuilder.bind(dlxQueue).to(dlxExchange).with(CommentConstant.DLX_ROUTING_KEY);
    }

    /************************************************ 延时队列 *******************************************************/
    /**
     * 创建延时队列并绑定死信交换机
     */
    @Bean
    public Queue delayQueue() {
        // 订单队列绑定死信交换机
        HashMap<String, Object> arguments = new HashMap<>(2);
        arguments.put("x-dead-letter-exchange", CommentConstant.DLX_EXCHANGE_NAME);
        arguments.put("x-dead-letter-routing-key", CommentConstant.DLX_ROUTING_KEY);
//        arguments.put("x-message-ttl", 5000); // SpringBoot 集成MQ 不推荐使用该方式进行配置延时队列
        return new Queue(CommentConstant.DELAY_QUEUE, true, false, false, arguments);
    }

    /**
     * 创建延时队列交换机
     *
     * @return
     */
    @Bean
    public DirectExchange delayExchange() {
        return new DirectExchange(CommentConstant.DELAY_EXCHANGE_NAME);
    }


    /**
     * 订单队列绑定订单交换机使用 路由键
     */
    @Bean
    public Binding delayBindingExchange(Queue delayQueue, DirectExchange delayExchange) {
        return BindingBuilder.bind(delayQueue).to(delayExchange).with(CommentConstant.DELAY_ROUTING_KEY);
    }
}
